package com.sm.minio;

import io.minio.MinioClient;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName Minio
 * @Description Minio文件存储云服务相关工具类  api文档：https://docs.min.io/cn/java-client-api-reference.html
 * @Author
 **/
@Getter
@Slf4j
public class Minio {

    /**
     * 服务器地址
     */
    private static final String ip = "106.14.207.234:9000";

    /**
     * 登录账号
     */
    private static final String accessKey = "xym123456";

    /**
     * 登录密码
     */
    private static final String secretKey = "xym123456789";


    /**
     * 桶名：动态圈视频
     */
    public static final String BUCKET_SHARE_VIDEO = "share-video";


    /**
     * 桶名：动态圈图
     */
    public static final String BUCKET_SHARE_IMAGE = "share-image";

    /**
     * Minio文件上传
     *
     * @param files 文件实体
     * @return
     */
    public static List<String> minioUpload(MultipartFile[] files, String bucketName) {
        ArrayList<String> fileList = new ArrayList<>();
        for (MultipartFile file : files) {
            if (StringUtils.isEmpty(file.getOriginalFilename())) {
                continue;
            }
            try {
                MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);
                boolean bucketExists = minioClient.bucketExists(bucketName);
                if (bucketExists) {
//                    log.info("仓库" + bucketName + "已经存在，可直接上传文件。");
                } else {
                    minioClient.makeBucket(bucketName);
                }
                if (file.getSize() <= 50971520) {
                    // fileName为空，说明要使用源文件名上传
                    String fileName = System.currentTimeMillis() + "";
                    fileName += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                    fileName = fileName.replaceAll(" ", "_");

                    // minio仓库名
                    minioClient.putObject(bucketName, fileName, file.getInputStream(), file.getContentType());
                    log.info("成功上传文件 " + fileName + " 至 " + bucketName);
                    String fileUrl = "http://store.xof.cn/" + bucketName + "/" + fileName;
                    fileList.add(fileUrl);
                    log.info("文件{}上传成功", fileUrl);
                } else {
                    throw new Exception("请上传小于40mb的文件");
                }

            } catch (Exception e) {
                e.printStackTrace();
                if (e.getMessage().contains("ORA")) {
                    log.error("上传失败:【查询参数错误】");
                }
            }
        }

        return fileList;
    }


    /**
     * Minio文件上传
     *
     * @return
     */
    public static String minioUpload(InputStream inputStream, String bucketName) {

        try {
            MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);

            // fileName为空，说明要使用源文件名上传
            String fileName = System.currentTimeMillis() + "";
            fileName = fileName.replaceAll(" ", "_");
            fileName += ".png";

            // minio仓库名
            minioClient.putObject(bucketName, fileName, inputStream, "image/png");
            log.info("成功上传文件 " + fileName + " 至 " + bucketName);
            String fileUrl = "http://store.xof.cn/" + bucketName + "/" + fileName;
            log.info("文件{}上传成功", fileUrl);
            return fileUrl;
        } catch (Exception e) {
            e.printStackTrace();
            if (e.getMessage().contains("ORA")) {
                log.error("上传失败:【查询参数错误】");
            }

        }
        return null;
    }

    /**
     * 判断文件是否存在
     *
     * @param fileName   文件名
     * @param bucketName 桶名（文件夹）
     * @return
     */
    public static boolean isFileExisted(String fileName, String bucketName) {
        InputStream inputStream = null;
        try {
            MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);
            inputStream = minioClient.getObject(bucketName, fileName);
            if (inputStream != null) {
                return true;
            }
        } catch (Exception e) {
            return false;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

    /**
     * 删除文件
     *
     * @param bucketName 桶名（文件夹）
     * @param fileName   文件名
     * @return
     */
    public boolean delete(String bucketName, String fileName) {
        try {
            MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);
            minioClient.removeObject(bucketName, fileName);
            return true;
        } catch (Exception e) {
            log.error(e.getMessage());
            return false;
        }
    }
//
//    /**
//     * 下载文件
//     * @param objectName 文件名
//     * @param bucketName 桶名（文件夹）
//     * @param response
//     * @return
//     */
//    public R downloadFile(String objectName,String bucketName, HttpServletResponse response) {
//        try {
//            MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);
//            InputStream file = minioClient.getObject(bucketName,objectName);
//            String filename = new String(objectName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
//            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//            ServletOutputStream servletOutputStream = response.getOutputStream();
//            int len;
//            byte[] buffer = new byte[1024];
//            while((len=file.read(buffer)) > 0){
//                servletOutputStream.write(buffer, 0, len);
//            }
//            servletOutputStream.flush();
//            file.close();
//            servletOutputStream.close();
//            return R.ok(objectName + "下载成功");
//        } catch (Exception e) {
//            e.printStackTrace();
//            if (e.getMessage().contains("ORA")) {
//                return R.error("下载失败:【查询参数错误】");
//            }
//            return R.error("下载失败：【" + e.getMessage() + "】");
//        }
//    }
//

    /**
     * 获取文件流
     *
     * @param objectName 文件名
     * @param bucketName 桶名（文件夹）
     * @return
     */
    public static InputStream getFileInputStream(String objectName, String bucketName) {
        try {
            MinioClient minioClient = new MinioClient("http://" + ip, accessKey, secretKey);
            return minioClient.getObject(bucketName, objectName);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
        return null;
    }


}


